
import 'package:flutter/material.dart';
import 'package:xsdk_flutter/xsdk/framework/page/x_page_state.dart';
import 'package:xsdk_flutter/xsdk/utils/x_utils_widget.dart';


/*
页面父类基础界面
listView通用State,
支持添加listview内部头部和尾部(滚动)
支持分页

 */
abstract class XPageScrollViewState extends XPageState {


  /*
  可在子类取消required(这里强制required则子类会提示生成构造方法)
  各种listview类型在子类的构造方法中设置其值
   */
  XPageScrollViewState(
      {
        super.isKeepPageState=false,
        super.xTag,
        super.handleAndFinishPageFunction,
      }
      );


  //重写方法///////////////////////////////////////////////////

  @required
  List<Widget> getScrollViewItemWidgets();


  EdgeInsets getScrollViewPadding(){
    return XWidgetUtils.getEdgeInsets(0, 0, 0, 0);
  }

  //分页,重写/////////////////////////////////////////////////////////
  /*
  分页统一使用:
  widget.currentPageIndex;
  widget.totalPages;
   */

  //是否启用分页加载数据
  bool getIsEnablePageLoadData(){
    return false;
  }

  //是否启用下拉刷新数据
  bool getIsEnableRefreshLoadData(){
    return false;
  }

  @override
  bool getIsPageIndexStartWith1() {
    //分页加载是否从第1页开始,否则从0开始
    return true;
  }

  //私有方法/////////////////////////////////////////////////////////

  /*
  添加AnimatedList控件
   */
  @override
  Widget getBodyWidget(BuildContext context) {

    return XWidgetUtils.getLayoutSingleChildScrollView(
      padding:getScrollViewPadding(),
      //支持分页
      initialScrollOffset: widget.currentScrollViewPosition,
      onNotifyScrollStop: (ScrollController? scrollController){
        //启用分页加载数据
        widget.currentScrollViewPosition=scrollController?.offset??0.0;
      },
      onNotifyScrollBottomPosition: !getIsEnablePageLoadData()?null:(e){
        //滑动到底部通知,加载下一页
        if(widget.currentPageIndex<widget.totalPages){
          updateData(pageIndex: widget.currentPageIndex+1);
        }
      },
      onRefresh: !getIsEnableRefreshLoadData()?null:() async{
        updateData(pageIndex: getIsPageIndexStartWith1()?1:0);
      },
      child: XWidgetUtils.getLayoutColumn(children: getScrollViewItemWidgets()),
    );


  }


  //数据更新///////////////////////////

  void setXListData_pageIndexData(
      int? pageIndex,
      int? pageCount,
      List<dynamic>? items
      ){

    setState((){

      pageIndex??=0;
      pageCount??=0;

      //判断是否删除所有数据
      if(getIsPageIndexStartWith1()){
        //分页从第1页开始
        if(pageIndex==0 || pageIndex==1){
          widget.listData.clear();
        }
      }else{
        //分页从0开始
        if(pageIndex==0){
          widget.listData.clear();
        }
      }

      widget.currentPageIndex=pageIndex!;
      widget.totalPages=pageCount!;

      //
      if(items!=null){
        widget.listData.addAll(items);
      }

    });

  }


  //追加单条数据,适合ListView,AnimatedList使用,但不适合Dismissible使用
  void setXListData_addOneItem(
      dynamic item,
      {
        int? position, //插入位置
      }
      ){

    setState((){
      //先添加item,后更新
      if(position==null || position!<0){
        //在末尾添加
        widget.listData.add(item);
      }else{
        //按位置插入
        if(position!>widget.listData.length){
          position=widget.listData.length;
        }
        widget.listData.insert(position!, item);
      }
    });

  }

  //追加多条
  void setXListData_addAllItems(
      List<dynamic>? items,
      {
        int? position, //插入位置
        bool isReplaceAllItems=true,//替换所有数据
      }
      ){

    setState((){

      if(isReplaceAllItems){
        widget.listData.clear();
      }

      if(items!=null) {
        //先添加item,后更新
        if (position == null || position! < 0) {
          //在末尾添加
          widget.listData.addAll(items);
        } else {
          //按位置插入
          if (position! > widget.listData.length) {
            position = widget.listData.length;
          }
          widget.listData.insertAll(position!, items);
        }
      }
    });

  }

  //删除数据(适合存在重复相同的数据,按位置删除)
  void setXListData_removeItemByPosition(int position){
    setState((){
      //widget.listData.remove(item);
      widget.listData.removeAt(position);
    });
  }


  //删除所有数据
  void setXListData_removeAllItems(){
    setState((){
      widget.listData.clear();
    });

  }


}